package cn.edu.ctbu.service.impl;

import cn.edu.ctbu.entity.UserEntity;
import cn.edu.ctbu.mapper.AuthMapper;
import cn.edu.ctbu.mapper.RoleMapper;
import cn.edu.ctbu.mapper.UserMapper;
import cn.edu.ctbu.service.IUserService;
import cn.edu.ctbu.util.JWTUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @author xiaopeng
 * @version 1.0
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements IUserService  {

    @Resource
    private UserMapper userMapper;
    @Resource
    private RoleMapper roleMapper;

    @Resource
    private AuthMapper authMapper;

    @Resource
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 查询所有用户信息
     *
     * @return 用户信息列表
     */
    public Object findAll() {
        // 创建查询条件，查询用户名为admin的用户
        QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", "admin");

        // 创建分页对象，设置当前页和每页大小
        Page<UserEntity> page = new Page<>(1, 2);

        // 执行分页查询

        return userMapper.selectPage(page, null);
    }

    /**
     * 用户登录方法
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录结果，包括token或提示信息
     */
    public Object login(String username, String password) {
        // 调用Mapper方法进行用户名和密码验证
        UserEntity login = userMapper.login(username, password);

        if (login == null) {
            return "用户名或密码错误";
        }

        // 检查Redis中是否已存在该用户的Token
        Boolean bool = redisTemplate.hasKey(login.getUsername());

        String token = null;

        if (Boolean.FALSE.equals(bool)) {
            // 如果Redis中不存在Token，则创建新Token
            token = JWTUtil.createToken(login.getUsername());
            // 将新Token存入Redis，设置过期时间为24小时
            redisTemplate.opsForValue().set(login.getUsername(), token, 24, TimeUnit.HOURS);
        } else {
            return redisTemplate.opsForValue().get(login.getUsername()); // 若已经登录直接返回redis中的token
        }
        return token;
    }
}
